package com.yt.product.api.client;

import com.baomidou.mybatisplus.plugins.Page;
import com.yt.common.constant.Result;
import com.yt.common.enums.CodeEnum;
import com.yt.product.models.bo.ProductInfoBO;
import com.yt.product.models.dto.ProductInfoDTO;
import com.yt.product.models.service.IProductInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.Map;

/**
 *
 * @author lianyadong
 * @Date 2025-09-03 14:16:03
 */
@RestController
@RequestMapping("/api/productInfo") // 与前端请求前缀完全一致：/api/productInfo
@Slf4j
@Api(value = "ProductInfoApiController", tags = "产品信息Api接口")
public class ProductInfoApiController {

    // 注入产品信息Service（需确保IProductInfoService接口已定义并实现）
    @DubboReference
    private IProductInfoService productInfoService;

    @PostMapping("/get")
    @ApiOperation(value = "根据id查找产品", notes = "根据产品ID查询详情")
    @ApiImplicitParam(name = "id", value = "产品ID", required = true, paramType = "query", dataType = "Long")
    public Result<ProductInfoDTO> get(@RequestParam("id") Long id) {
        if (id == null || id <= 0) {
            log.warn("查询产品失败：ID无效（id={}）", id);
            return new Result<>(CodeEnum.FAIL_100002); // 参数不能为空/无效
        }

        ProductInfoDTO dto = productInfoService.selectById(id);
        log.info("查询产品结果：ID={}，存在={}", id, dto != null);
        return new Result<>(dto);
    }

    @PostMapping("/queryPageList")
    @ApiOperation(value = "产品信息列表", notes = "分页查询产品，支持状态、时间范围筛选，关联显示类型和供应商名称")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "pageNo", value = "当前页码", defaultValue = "1", paramType = "query", dataType = "Integer"),
            @ApiImplicitParam(name = "pageSize", value = "每页条数", defaultValue = "10", paramType = "query", dataType = "Integer"),
            @ApiImplicitParam(name = "status", value = "产品状态（0=下架，1=在售，2=已删除）", required = false, paramType = "query", dataType = "Integer"),
            @ApiImplicitParam(name = "productName", value = "产品名称（模糊查询）", required = false, paramType = "query", dataType = "String"),
            @ApiImplicitParam(name = "price",value = "价格范围（格式：min-max）", required = false, paramType = "query", dataType = "String"),
            @ApiImplicitParam(name = "startDate", value = "创建时间起始（格式：yyyy-MM-dd HH:mm:ss）", required = false, paramType = "query", dataType = "String"),
            @ApiImplicitParam(name = "endDate", value = "创建时间结束（格式：yyyy-MM-dd HH:mm:ss）", required = false, paramType = "query", dataType = "String")
    })
    public Result<Page<ProductInfoDTO>> queryPageList(
            @RequestParam(defaultValue = "1") Integer pageNo,
            @RequestParam(defaultValue = "10") Integer pageSize,
            @RequestBody(required = false) ProductInfoBO bo) { // BO参数使用@RequestBody接收
        // 1. 处理分页参数
        int validPageNo = (pageNo < 1) ? 1 : pageNo;
        int validPageSize = (pageSize < 1 || pageSize > 100) ? 10 : pageSize;
        Page<ProductInfoDTO> page = new Page<>(validPageNo, validPageSize);

        // 2. 调用Service的【关联查询】方法（替换默认单表查询）
        // 注意：此处需新增Service方法，而非用原selectPage（原方法是单表查询）
        Page<ProductInfoDTO> resultPage = productInfoService.queryProductWithRelation(page, bo);

        log.info("产品分页查询完成：页码={}，条数={}，总记录数={}", validPageNo, validPageSize, resultPage.getTotal());
        return new Result<>(resultPage);
    }

    @PostMapping("/updateStatus")
    @ApiOperation(value = "更新产品状态", notes = "启用/禁用产品，status=1启用，status=0禁用；不允许设置为2（已删除）")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "产品ID", required = true, paramType = "body", dataType = "Long"),
            @ApiImplicitParam(name = "status", value = "目标状态（0=禁用，1=启用）", required = true, paramType = "body", dataType = "Integer")
    })
    public Result updateStatus(@RequestBody Map<String, Object> params) {
        // 1. 解析并校验参数（匹配前端JSON请求格式）
        Long id = parseLongParam(params.get("id"), "产品ID");
        Integer status = parseIntegerParam(params.get("status"), "产品状态");

        if (id == null) {
            return new Result<>(CodeEnum.FAIL_100002); // ID不能为空
        }
        if (status == null || (status != 0 && status != 1)) {
            log.warn("更新产品状态失败：无效状态（status={}，仅支持0/1）", status);
            return new Result<>(CodeEnum.FAIL_100003); // 状态参数错误
        }

        // 2. 校验产品是否存在且未删除
        ProductInfoDTO existDto = productInfoService.selectById(id);
        if (existDto == null) {
            log.warn("更新产品状态失败：ID={}的产品不存在", id);
            return new Result<>(CodeEnum.FAIL_100004); // 记录不存在
        }
        if (existDto.getStatus() == 2) {
            log.warn("更新产品状态失败：ID={}的产品已删除，无法操作", id);
            return new Result<>(CodeEnum.FAIL_100005); // 已删除记录不允许操作
        }
        if (existDto.getStatus().equals(status)) {
            log.info("更新产品状态：ID={}，当前状态已为{}，无需操作", id, status);
            return new Result<>(); // 状态无变化，视为成功
        }

        // 3. 调用Service更新状态（同步修改时间）
        ProductInfoDTO updateDto = new ProductInfoDTO();
        updateDto.setId(id);
        updateDto.setStatus(status);
        updateDto.setUpdateTime(new Date()); // 记录修改时间
        boolean success = productInfoService.updateById(updateDto);

        // 4. 日志与返回结果
        if (success) {
            log.info("更新产品状态成功：ID={}，旧状态={}，新状态={}", id, existDto.getStatus(), status);
            return new Result<>(); // 成功响应
        } else {
            log.error("更新产品状态失败：ID={}（数据库操作失败）", id);
            return new Result<>(CodeEnum.FAIL_100006); // 操作失败
        }
    }

    @PostMapping("/delete")
    @ApiOperation(value = "删除产品", notes = "软删除：将产品状态改为2（已删除），不物理删除数据")
    @ApiImplicitParam(name = "id", value = "产品ID", required = true, paramType = "body", dataType = "Long")
    public Result delete(@RequestBody Map<String, Object> params) {
        // 1. 解析并校验参数
        Long id = parseLongParam(params.get("id"), "产品ID");
        if (id == null) {
            return new Result<>(CodeEnum.FAIL_100002); // ID不能为空
        }

        // 2. 校验产品是否存在且未删除
        ProductInfoDTO existDto = productInfoService.selectById(id);
        if (existDto == null) {
            log.warn("删除产品失败：ID={}的产品不存在", id);
            return new Result<>(CodeEnum.FAIL_100004); // 记录不存在
        }
        if (existDto.getStatus() == 2) {
            log.info("删除产品：ID={}的产品已删除，无需重复操作", id);
            return new Result<>(); // 已删除，视为成功
        }

        // 3. 软删除：更新状态为2，同步修改时间
        ProductInfoDTO deleteDto = new ProductInfoDTO();
        deleteDto.setId(id);
        deleteDto.setStatus(2); // 软删除标记
        deleteDto.setUpdateTime(new Date());
        boolean success = productInfoService.updateById(deleteDto);

        // 4. 日志与返回结果
        if (success) {
            log.info("软删除产品成功：ID={}，原状态={}", id, existDto.getStatus());
            return new Result<>(); // 成功响应
        } else {
            log.error("软删除产品失败：ID={}（数据库操作失败）", id);
            return new Result<>(CodeEnum.FAIL_100006); // 操作失败
        }
    }

    /**
     * 解析参数为Long（处理null和非数字）
     */
    private Long parseLongParam(Object param, String paramName) {
        if (param == null) {
            log.warn("参数{}为空", paramName);
            return null;
        }
        try {
            return Long.valueOf(param.toString().trim());
        } catch (NumberFormatException e) {
            log.warn("参数{}格式错误（值：{}），需为数字", paramName, param);
            return null;
        }
    }

    /**
     * 解析参数为Integer（处理null和非数字）
     */
    private Integer parseIntegerParam(Object param, String paramName) {
        if (param == null) {
            log.warn("参数{}为空", paramName);
            return null;
        }
        try {
            return Integer.valueOf(param.toString().trim());
        } catch (NumberFormatException e) {
            log.warn("参数{}格式错误（值：{}），需为数字", paramName, param);
            return null;
        }
    }
}

